	/* Mise en oeuvre contigue d'une liste de structure */

#include "meoliste.h"

void init_liste(t_liste* p)
{	
	/* Initialisation le drapeau et l'ec de la liste */
	t_element* drapeau = NULL;
	t_element* ec = NULL;
	p->drapeau = drapeau;
	p->ec = ec;
	p->drapeau=(t_element*)malloc(sizeof(t_element));
	p->drapeau->pred=p->drapeau;
	p->drapeau->succ=p->drapeau;
	p->ec = p->drapeau;
}

int liste_vide(t_liste* p)
{	/* Renvoi vrai si la liste est vide */
	return (p->drapeau->succ==p->drapeau||p->drapeau->pred==p->drapeau);
}

int hors_liste(t_liste* p)
{	/* Renvoi vrai si l'ec est sur le drapeau */
	return(p->ec==p->drapeau);
}

void en_tete(t_liste* p)
{	/* Permet de se placer en tête de la liste */
	if(!liste_vide(p)) { p->ec = p->drapeau->succ; }
}

void en_queue(t_liste* p)
{	/* Permet de se placer en queue de la liste */
	if(!liste_vide(p)) p->ec = p->drapeau->pred;
}

void precedent(t_liste* p)
{	/* Permet d'aller à l'élément précédent */
	if(!hors_liste(p)) p->ec = p->ec->pred;
}

void suivant(t_liste* p)
{	/* Permet d'aller à l'élément suivant */
	if(!hors_liste(p)) p->ec = p->ec->succ;
}

void valeur_elt(t_liste* p, t_rattaupes *e)
{	/* Permet d'obtenir la valeur de l'élément courant */
	if(!hors_liste(p))
		*e = p->ec->rattaupes;
}

void modif_elt(t_liste* p, t_rattaupes v)
{	/* Permet de modifier la valeur de l'élément courant */
	if(!hors_liste(p)) p->ec->rattaupes=v;
}

void oter_elt(t_liste* p)
{	/* Supprime l'élément courant de la liste */
	if(!hors_liste(p))
	{	
		t_element *temp;
		temp=p->ec;
		p->ec->succ->pred=p->ec->pred;
		p->ec->pred->succ=p->ec->succ;
		p->ec=p->ec->pred;
		free(temp);
	}
}

void ajout_droit(t_liste* p, t_rattaupes e)
{	/* Ajoute un élément à droite de l'élément courant; ec devient le nouveau élément */
	if(liste_vide(p)||!hors_liste(p))
	{	
		t_element *nouv;
		nouv=(t_element*)malloc(sizeof(t_element));
		nouv->rattaupes=e;
		nouv->succ=p->ec->succ;
		nouv->pred=p->ec;
		p->ec->succ->pred=nouv;
		p->ec->succ=nouv;
		p->ec=nouv;
	}
}

void ajout_gauche(t_liste* p, t_rattaupes e)
{	/* Ajoute un élément à gauche de l'élément courant; ec devient le nouveau élément */
	if(liste_vide(p)||!hors_liste(p))
	{
		t_element *nouv;
		nouv=(t_element*)malloc(sizeof(t_element));
		nouv->rattaupes=e;
		nouv->pred=p->ec->pred;
		nouv->succ=p->ec;
		p->ec->pred->succ=nouv;
		p->ec->pred=nouv;
		p->ec=nouv;
	}
}

void vider(t_liste* p)
{	/* Permet de vider une liste */
	en_queue(p);
	while(!hors_liste(p)){
		oter_elt(p);
	}
}
